package tests;

import static org.junit.Assert.*;

import java.util.*;

import org.junit.Before;
import org.junit.Test;

import TecMaster.Agenda;
import TecMaster.Equipamentos.*;
import TecMaster.Equipamentos.Equipamento.*;

/**
 * Testes da Classe Agenda do projeto TecMaster
 * 
 * @author Theocrito Moura
 * 
 * @version 0.1
 */

public class TesteAgenda {

	Agenda<Equipamento> agenda1;

	Equipamento equip1;
	Equipamento equip2;
	Equipamento equip3;

	@Before
	public void setUp() throws Exception {
		agenda1 = new Agenda<Equipamento>();
		equip1 = new Tv(MarcasAutorizadas.LG, DefeitosMaisComuns.NAO_LIGA,
				"001", 1, true, agenda1.getTotalDias());
		equip2 = new Dvd(MarcasAutorizadas.LG, DefeitosMaisComuns.NAO_LIGA,
				"002", 2, true, agenda1.getTotalDias());
		equip3 = new Computador(MarcasAutorizadas.LG,
				DefeitosMaisComuns.NAO_LIGA, "003", 3, true, agenda1
						.getTotalDias());
	}

	@Test(expected = Exception.class)
	public void testaAddEquipamentoListaCheia() throws Exception {
		Equipamento equip4 = new AparelhoDeSom(MarcasAutorizadas.LG,
				DefeitosMaisComuns.NAO_LIGA, "004", 4, true, agenda1
						.getTotalDias());
		Equipamento equip5 = new Tv(MarcasAutorizadas.LG,
				DefeitosMaisComuns.NAO_LIGA, "005", 5, true, agenda1
						.getTotalDias());
		Equipamento equip6 = new Dvd(MarcasAutorizadas.LG,
				DefeitosMaisComuns.NAO_LIGA, "006", 6, true, agenda1
						.getTotalDias());
		agenda1.addEquipamento(equip1);
		agenda1.addEquipamento(equip2);
		agenda1.addEquipamento(equip3);
		agenda1.addEquipamento(equip4);
		agenda1.addEquipamento(equip5);
		agenda1.addEquipamento(equip6);
		agenda1.addEquipamento(equip6);
	}

	@Test(expected = Exception.class)
	public void testaAddEquipamentoNull() throws Exception {
		agenda1.addEquipamento(null);
	}

	@Test
	public void testaAddEquipamento() throws Exception {
		assertEquals("Numero de equipamentos deveria ser 0", 0, agenda1
				.numeroDeEquipamentosNaFila());
		assertTrue(agenda1.addEquipamento(equip1));
		assertEquals("Equipamento nao foi adicionado", 1, agenda1
				.numeroDeEquipamentosNaFila());
		assertFalse("nao deveria ter sido adicionado o mesmo equipamento",
				agenda1.addEquipamento(equip1));
	}

	@Test(expected = Exception.class)
	public void testaRemoveEquipamentoNull() throws Exception {
		agenda1.removeEquipamento(null);
	}

	@Test
	public void testaRemoveEquipamento() throws Exception {
		assertTrue(agenda1.addEquipamento(equip1));
		assertTrue(agenda1.addEquipamento(equip2));

		assertEquals("Equipamento nao foi adicionado", 2, agenda1
				.numeroDeEquipamentosNaFila());
		assertTrue(agenda1.removeEquipamento(equip1));
		assertEquals("Equipamento nao foi removido", 1, agenda1
				.numeroDeEquipamentosNaFila());
		assertFalse("nao deveria ter sido removido", agenda1
				.removeEquipamento(equip1));
		assertEquals("Equipamento nao foi removido", 1, agenda1
				.numeroDeEquipamentosNaFila());
	}

	@Test
	public void testaListaTodosEquipamentos() throws Exception {
		assertTrue(agenda1.addEquipamento(equip1));
		assertTrue(agenda1.addEquipamento(equip2));
		assertTrue(agenda1.addEquipamento(equip3));

		List<Equipamento> list = agenda1.listaTodosEquipamentos();

		assertNotNull(list);
		assertEquals(3, list.size());
	}

	@Test
	public void testaTakeEquipamento() throws Exception {
		assertTrue(agenda1.addEquipamento(equip1));
		assertTrue(agenda1.addEquipamento(equip3));
		assertTrue(agenda1.addEquipamento(equip2));

		assertEquals("Tamanho Erado", 3, agenda1.numeroDeEquipamentosNaFila());
		assertEquals("Equipamento nao foi tirado", equip1, agenda1
				.takeEquipamento());
		assertEquals("Tamanho errado", 2, agenda1.numeroDeEquipamentosNaFila());
		assertEquals("Equipamento nao foi tirado", equip3, agenda1
				.takeEquipamento());
		assertEquals("Tamanho errado", 1, agenda1.numeroDeEquipamentosNaFila());
	}

	@Test
	public void testaGetTotalDias() throws Exception {
		assertTrue(agenda1.addEquipamento(equip1));
		assertTrue(agenda1.addEquipamento(equip2));
		assertTrue(agenda1.addEquipamento(equip3));

		int diasParaConserto = equip1.getDiasParaConserto()
				+ equip2.getDiasParaConserto() + equip3.getDiasParaConserto();

		assertEquals(diasParaConserto, agenda1.getTotalDias());

	}

	@Test
	public void testaGetDataDeSaida() throws Exception {
		Equipamento equip4 = new AparelhoDeSom(MarcasAutorizadas.LG,
				DefeitosMaisComuns.NAO_LIGA, "004", 4, true, agenda1
						.getTotalDias());
		agenda1.addEquipamento(equip4);
		Equipamento equip5 = new Tv(MarcasAutorizadas.LG,
				DefeitosMaisComuns.NAO_LIGA, "005", 5, true, agenda1
						.getTotalDias());
		agenda1.addEquipamento(equip5);
		Equipamento equip6 = new Dvd(MarcasAutorizadas.LG,
				DefeitosMaisComuns.NAO_LIGA, "006", 6, true, agenda1
						.getTotalDias());
		agenda1.addEquipamento(equip6);

		Calendar dataSaidaEquip6 = new GregorianCalendar();
		dataSaidaEquip6.add(Calendar.DAY_OF_YEAR, +15);
		assertEquals("data de saida errada", dataSaidaEquip6, equip6
				.getDataDeSaida());

		Calendar dataSaidaEquip5 = new GregorianCalendar();
		dataSaidaEquip5.add(Calendar.DAY_OF_YEAR, +10);
		assertEquals("data de saida errada", dataSaidaEquip5, equip5
				.getDataDeSaida());
	}

}
